/* Copyright (c) 2010-2013 Marcus Westin */
(function(e) {
	function o() {
		try {
			return r in e && e[r]
		} catch (t) {
			return !1
		}
	}
	var t = {}, n = e.document, r = "localStorage", i = "script", s;
	t.disabled = !1, t.set = function(e, t) {
	}, t.get = function(e) {
	}, t.remove = function(e) {
	}, t.clear = function() {
	}, t.transact = function(e, n, r) {
		var i = t.get(e);
		r == null && (r = n, n = null), typeof i == "undefined"
				&& (i = n || {}), r(i), t.set(e, i)
	}, t.getAll = function() {
	}, t.forEach = function() {
	}, t.serialize = function(e) {
		return JSON.stringify(e)
	}, t.deserialize = function(e) {
		if (typeof e != "string")
			return undefined;
		try {
			return JSON.parse(e)
		} catch (t) {
			return e || undefined
		}
	};
	if (o())
		s = e[r], t.set = function(e, n) {
			return n === undefined ? t.remove(e) : (s
					.setItem(e, t.serialize(n)), n)
		}, t.get = function(e) {
			return t.deserialize(s.getItem(e))
		}, t.remove = function(e) {
			s.removeItem(e)
		}, t.clear = function() {
			s.clear()
		}, t.getAll = function() {
			var e = {};
			return t.forEach(function(t, n) {
						e[t] = n
					}), e
		}, t.forEach = function(e) {
			for (var n = 0; n < s.length; n++) {
				var r = s.key(n);
				e(r, t.get(r))
			}
		};
	else if (n.documentElement.addBehavior) {
		var u, a;
		try {
			a = new ActiveXObject("htmlfile"), a.open(), a.write("<" + i
					+ ">document.w=window</" + i
					+ '><iframe src="/favicon.ico"></iframe>'), a.close(), u = a.w.frames[0].document, s = u
					.createElement("div")
		} catch (f) {
			s = n.createElement("div"), u = n.body
		}
		function l(e) {
			return function() {
				var n = Array.prototype.slice.call(arguments, 0);
				n.unshift(s), u.appendChild(s), s
						.addBehavior("#default#userData"), s.load(r);
				var i = e.apply(t, n);
				return u.removeChild(s), i
			}
		}
		var c = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
		function h(e) {
			return e.replace(/^d/, "___$&").replace(c, "___")
		}
		t.set = l(function(e, n, i) {
					return n = h(n), i === undefined ? t.remove(n) : (e
							.setAttribute(n, t.serialize(i)), e.save(r), i)
				}), t.get = l(function(e, n) {
					return n = h(n), t.deserialize(e.getAttribute(n))
				}), t.remove = l(function(e, t) {
					t = h(t), e.removeAttribute(t), e.save(r)
				}), t.clear = l(function(e) {
					var t = e.XMLDocument.documentElement.attributes;
					e.load(r);
					for (var n = 0, i; i = t[n]; n++)
						e.removeAttribute(i.name);
					e.save(r)
				}), t.getAll = function(e) {
			var n = {};
			return t.forEach(function(e, t) {
						n[e] = t
					}), n
		}, t.forEach = l(function(e, n) {
					var r = e.XMLDocument.documentElement.attributes;
					for (var i = 0, s; s = r[i]; ++i)
						n(s.name, t.deserialize(e.getAttribute(s.name)))
				})
	}
	try {
		var p = "__storejs__";
		t.set(p, p), t.get(p) != p && (t.disabled = !0), t.remove(p)
	} catch (f) {
		t.disabled = !0
	}
	t.enabled = !t.disabled, typeof module != "undefined" && module.exports
			&& this.module !== module
			? module.exports = t
			: typeof define == "function" && define.amd
					? define(t)
					: e.store = t
})(Function("return this")())